#include "Key.h"
#include <iostream>
#include "../FuncionesUtiles.h"

Key::Key(const Key& otro) {
	if (otro.dato != NULL) {
		this->dato = otro.dato->getCopia();
	} else {
		this->dato = NULL;
	}
}

cantBytes Key::getTamanio() {
	return 0;
}

Key::Key(DatoClave* clave) {

	this->dato = clave;
}

Key::Key() {

	this->dato = NULL;
}

Key::~Key() {
	if (this->dato != NULL) {
		delete this->dato;
		this->dato = NULL;
	}
}

Bytes Key::serializarse() {
	Bytes bytes;
	if (dato) {
		bytes.agregarAlFinal(this->dato->serializarse());
	}
	return bytes;
}

bool Key::hidratarse(const Bytes& b) {

	if (this->dato) {
		return this->dato->hidratarse(b);
	}
	return false;
}

Key& Key::operator=(const Key& otro) {
	if (this != &otro){
		if (this->dato != NULL) {
				delete this->dato;
			}

			if (otro.dato != NULL) {
				this->dato = otro.dato->getCopia();
			} else {
				this->dato = NULL;
			}
	}
		//	if(otro.dato!=NULL){
	//		if(dato!=NULL){
	//			delete dato;
	//			dato = NULL;
	//		}
	//		this->dato =  otro.dato->getCopia();
	//	}else{
	//		this->dato = NULL;
	//	}
	return *this;
}

bool Key::operator==(const Key& otro) const {
	if (dato == NULL && otro.dato == NULL) {
		return true;
	}
	if (dato == NULL || otro.dato == NULL) {
		return false;
	}

	return ((*(this->dato)) == (*(otro.dato)));
}
bool Key::operator<(const Key& otro) const {
	if (dato == NULL || otro.dato == NULL) {
		return false;
	}

	return ((*(this->dato)) < (*(otro.dato)));
}

bool Key::operator>(const Key& otro) const {
	if (dato == NULL || otro.dato == NULL) {
		return false;
	}

	return ((*(this->dato)) > (*(otro.dato)));
}

bool Key::operator<=(const Key& otro) const {
	if (dato == NULL || otro.dato == NULL) {
		return false;
	}

	return ((*(this->dato)) <= (*(otro.dato)));
}

std::string Key::toString() const {
	if (dato != NULL) {
		return dato->toString();
	} else {
		return "lalaal";
	}
}
